/***********************************************************************************
 * 文件名： page_warn.c
 * 版本： 1
 * 说明：
 * 		告警页面，只显示固定的时间，时间到后切换到主页面或者关机。
 * 修改记录：
 * 	2024/01/10: 初版。 刘言。
***********************************************************************************/
#include "page_warn.h"
#include "resource.h"
#include "ui_ctrl.h"
#include "../app.h"
#include "components/lcd_drivers/lcd.h"
#include "components/lcd_drivers/simple_gui/sgui.h"


/////////////////////// 自定义类型

// 页面类
typedef struct _page_warn
{
    // 继承页面基类
    ui_page_base_t Base;    // 必须放在最开始表示继承(实例地址=本结构体实例地址)
    
    sg_pic_t PicIco;
    sg_pic_t PicText;
    sg_label_t Label;   // 缺少图片资源时显示文字

    ui_warn_code_t WarnCode;    // 告警代码，是什么告警
    u16 Timeout;
}page_t;


/////////////////////// 内部函数申明

static void TimerIsr(void *user_data);


/////////////////////// 事件

// 页面事件
static void PageEvent(ui_ev_t *e)
{
    page_t *this = (page_t *)e->Target;

    switch (e->Code)
    {
    case UI_EV_PAGE_LOADED:
        Polsys_SetEntry(&PublicTimer, TimerIsr, this);
        Polsys_SetInterval(&PublicTimer, 100);
        break;
    case UI_EV_PAGE_UNLOADED:
        Polsys_SetEntry(&PublicTimer, NULL, NULL);
        break;
    case UI_EV_RECEIVED_PKG:
        this->Timeout = 0;
        break;
    default:
        break;
    }
    
}

/**
 * 软定时器
*/
static void TimerIsr(void *user_data)
{
    page_t *this = (page_t *)user_data;

    this->Timeout++;

    if(this->WarnCode == UI_WARN_NO_BATTERY)
    {
        if(this->Timeout >= 30)App_PowerOff();
    }
    else if(this->WarnCode == UI_WARN_UPDATE)
    {
        // 接收超时后退出
        if(this->Timeout >= 10)Ui_SwitchToPage(Page_CreatNumMain, NULL);
    }
    else
    {
        if(this->Timeout >= 30)Ui_SwitchToPage(Page_CreatNumMain, NULL);
    }
}

/////////////////////// 删除

/**
 * 删除页面。
 * 在这里释放页面占用的所有内存，如果有必要可以清除显示。
*/
static void DeleteLogoPage(ui_page_base_t *page)
{
    free(page);
    // Lcd_Clear(0, 0, LCD_SIZE_X - 1, LCD_SIZE_Y - 1);
}

/////////////////////// 创建


ui_page_base_t * Page_CreatWarn(void *param)
{
    page_t *page = malloc(sizeof(page_t));
    Ui_PageBaseInit((ui_page_base_t *)page);
    Ui_PageSetDeleteFun((ui_page_base_t *)page, DeleteLogoPage);
    Ui_PageSetCb((ui_page_base_t *)page, PageEvent);

    page->WarnCode = (int)param;
    page->Timeout = 0;

    // 加载背景
    Lcd_Clear(0, 0, LCD_SIZE_X - 1, LCD_SIZE_Y - 1);

    SgPic_init(&page->PicIco);
    SgObj_setPosition(&page->PicIco, 17, 38);
    SgObj_setSize(&page->PicIco, PIC_T0_CLEAR_ICO_SIZE_X, PIC_T0_CLEAR_ICO_SIZE_Y);
    SgPic_setSource(&page->PicIco, PIC_T0_CLEAR_ICO_ADDR); // 设置源后会自动刷新

    SgPic_init(&page->PicText);
    
    SgLabel_init(&page->Label);

    switch(page->WarnCode)
    {
    case UI_WARN_NO_BATTERY:
        SgObj_setPosition(&page->Label, 0, 110);
        SgLabel_setText(&page->Label, "No Battery!");
        break;
    case UI_WARN_LOW_BATTERY:
        SgObj_setPosition(&page->Label, 0, 110);
        SgLabel_setText(&page->Label, "Low Battery!");
        break;
    case UI_WARN_TIMEOUT:
        SgObj_setPosition(&page->Label, 0, 110);
        SgLabel_setText(&page->Label, "Timeout!");
        break;
    case UI_WARN_OVER_LOAD:
        SgObj_setPosition(&page->Label, 0, 110);
        SgLabel_setText(&page->Label, "Overload!");
        break;
    case UI_WARN_NO_POD:
        SgObj_setPosition(&page->Label, 0, 110);
        SgLabel_setText(&page->Label, "No Pod!");
        break;
    case UI_WARN_CLEAR_PUFF:
        SgObj_setPosition(&page->PicText, 17, 103);
        SgObj_setSize(&page->PicText, PIC_T0_CLEAR_TEXT_SIZE_X, PIC_T0_CLEAR_TEXT_SIZE_Y);
        SgPic_setSource(&page->PicText, PIC_T0_CLEAR_TEXT_ADDR);
        break;
    case UI_WARN_UPDATE:
        SgObj_setPosition(&page->Label, 0, 110);
        SgLabel_setText(&page->Label, "Updating...");
        break;
    default: break;
    }
    return (ui_page_base_t *)page;
}

